package com.zkh.myutils.net;

import java.util.HashMap;
import java.util.Map;

import com.zkh.myutils.net.ftp.FTP;
import com.zkh.myutils.net.ftp.FTPClient;
import com.zkh.myutils.net.smtp.SMTP;
import com.zkh.myutils.net.smtp.SMTPClient;
import com.zkh.myutils.system.ConfigLoader;
import com.zkh.myutils.utils.Assert;
import com.zkh.myutils.utils.StringUtils;

/**
 * 客户端工厂，用来创建客户端
 * @author zkh
 */
public class ClientFactory {
	/** FTP配置参数 **/
	//FTP主机
	private static String ftpHostname;
	//FTP端口
	private static int ftpPort = FTP.DEFAULT_PORT;
	//登录帐号
	private static String ftpUsername;
	//登录密码
	private static String ftpPassword;
	//启用SSL标识
	private static boolean ftpEnableSSL;
	/** 邮件发送配置 **/
	// 主机
	private static String emailHostname;
	// 用户
	private static String emailUsername;
	// 密码
	private static String emailPassword;
	// 发件人
	private static String emailFrom;
	//FTP端口
	private static int emailPort = SMTP.DEFAULT_PORT;
	//临时端口
	private static String port;
	//启用SSL标识
	private static boolean emailEnableSSL;
	
	//读取配置
	static{
		/** FTP配置参数 **/
		//获取配置
		Map<String, String> config = ConfigLoader.getMap("ftp", new HashMap<>(), true);
		ftpHostname = config.get("hostname");	//主机
		port = config.get("port");		//端口
		ftpUsername = config.get("username");	//账号
		ftpPassword = ConfigLoader.decodeEnc(config.get("password"));	//密码
		//SSL启用标识
		ftpEnableSSL = "true".equalsIgnoreCase(config.get("enableSSL"));
		//保存端口，默认21
		Assert.doIfTrue(StringUtils.isNumber(port), ()-> ftpPort = Integer.parseInt(port));
		/** 邮件发送配置 **/
		config = ConfigLoader.getMap("email", new HashMap<>(), true);
		emailHostname = config.get("hostname");			//主机
		emailUsername = config.get("username");	//用户名
		emailPassword = ConfigLoader.decodeEnc(config.get("password"));	//密码
		emailFrom = config.get("from");			//发件人
		port = config.get("port");			//端口号
		//SSL启用标识
		emailEnableSSL = "true".equalsIgnoreCase(config.get("enableSSL"));
		//保存端口，默认25
		Assert.doIfTrue(StringUtils.isNumber(port), ()-> emailPort = Integer.parseInt(port));
	}
	
	/**
	 * 使用默认配置获取一个FTP客户端实例
	 */
	public static FTPClient getFTPClient() {
		return getFTPClient(ftpHostname, ftpPort, ftpUsername, ftpPassword);
	}
	
	/**
	 * 获取一个FTP客户端实例，服务器主机和端口使用默认配置
	 * @param username 帐号
	 * @param password 密码
	 */
	public static FTPClient getFTPClient(String username, String password) {
		return getFTPClient(ftpHostname, ftpPort, username, password);
	}
	
	/**
	 * 获取一个FTP客户端实例
	 * @param hostname 主机
	 * @param port 端口
	 * @param username 用户
	 * @param password 密码
	 */
	public static FTPClient getFTPClient(String hostname, int port, String username, String password) {
		return new FTPClient(hostname, port, username, password);
	}
	
	/**
	 * 使用默认配置获取一个SMTP客户端实例
	 */
	public static SMTPClient getSMTPClient() {
		return new SMTPClient(emailHostname, emailPort, emailUsername, emailPassword, emailFrom);
	}
	
	/**
	 * 获取一个SMTP客户端实例，主机使用配置值
	 * @param username 用户
	 * @param password 密码
	 * @param from 发件人
	 */
	public static SMTPClient getSMTPClient(String username, String password, String from) {
		return new SMTPClient(emailHostname, emailPort, username, password, from);
	}
	
	/**
	 * 获取一个SMTP客户端实例
	 * @param hostname 主机
	 * @param port 端口
	 * @param username 用户
	 * @param password 密码
	 * @param from 发件人
	 */
	public static SMTPClient getSMTPClient(String hostname, int port, String username, String password, String from) {
		return new SMTPClient(hostname, port, username, password, from);
	}
	
	/**
	 * FTP是否启用SSL
	 */
	public static boolean isFtpEnableSSL() {
		return ftpEnableSSL;
	}
	
	/**
	 * email是否启用SSL
	 */
	public static boolean isEmailEnableSSL() {
		return emailEnableSSL;
	}
}
